package com.yangleping.dynamic.thread.pool.sdk.registry.redis;

import com.yangleping.dynamic.thread.pool.sdk.domain.model.ThreadPoolConfigEntity;
import com.yangleping.dynamic.thread.pool.sdk.domain.valobj.RegistryEnumVO;
import com.yangleping.dynamic.thread.pool.sdk.registry.IRegistry;
import org.redisson.api.RBucket;
import org.redisson.api.RList;
import org.redisson.api.RedissonClient;

import java.time.Duration;
import java.util.List;

public class RedisRegistry implements IRegistry {

    private final RedissonClient redissonClient;

    public RedisRegistry(RedissonClient redissonClient) {
        this.redissonClient = redissonClient;
    }

    /**
     * 将线程池配置信息报告给Redis
     * 此方法用于将一组线程池配置实体对象添加到Redis中的列表结构
     * 主要目的是为了在系统启动时，将所有线程池的配置信息推送至Redis，以便动态调整线程池配置
     *
     * @param threadPoolConfigEntityList 线程池配置实体对象列表，包含多个线程池的配置信息
     */
    @Override
    public void reportThreadPool(List<ThreadPoolConfigEntity> threadPoolConfigEntityList) {
        // 获取Redis中的线程池配置列表，使用的是预先定义的键
        RList<ThreadPoolConfigEntity> list = redissonClient.getList(RegistryEnumVO.THREAD_POOL_CONFIG_LIST_KEY.getKey());
        list.delete();
        // 将所有的线程池配置实体对象添加到Redis列表中
        list.addAll(threadPoolConfigEntityList);
    }

    /**
     * 报告线程池配置参数
     * 本方法用于将线程池的配置信息上报并存储在Redis中，以便进行统一管理
     *
     * @param threadPoolConfigEntity 线程池配置实体，包含线程池的详细配置信息
     */
    @Override
    public void reportThreadPoolConfigParameter(ThreadPoolConfigEntity threadPoolConfigEntity) {
        // 构造缓存键，用于在Redis中唯一标识线程池配置信息
        String cacheKey = RegistryEnumVO.THREAD_POOL_CONFIG_PARAMETER_LIST_KEY.getKey() + "_" + threadPoolConfigEntity.getAppName() + "_" + threadPoolConfigEntity.getThreadPoolName();

        // 获取Redis中的桶对象，用于存储线程池配置信息
        RBucket<ThreadPoolConfigEntity> bucket = redissonClient.getBucket(cacheKey);

        // 将线程池配置信息存储到Redis中，并设置过期时间为30天
        bucket.set(threadPoolConfigEntity, Duration.ofDays(30));
    }
}
